hhkb
모의해킹

피버팅과터널링_08_SSH 다이나믹 포트 포워딩

작성자 : Heehyeon Yoo|2025-12-19
# 모의해킹# PNT# SSH# DynamicPortForwarding# SOCKS

1. 개요

SSH 다이나믹 포트 포워딩(Dynamic Port Forwarding)은 공격자 시스템에 SOCKS 프록시(Proxy)를 생성하고, 이를 통해 발생하는 트래픽을 SSH 터널을 경유하여 피벗 호스트로 보낸 뒤, 피벗 호스트에서 목적지로 릴레이(Relay)하는 기법이다.

기존의 로컬/리모트 포트 포워딩이 1:1 매핑(특정 포트를 특정 목적지로 연결)인 반면, 다이나믹 포트 포워딩은 1:N 매핑이다. 즉, 하나의 터널만으로 내부망에 존재하는 다수의 호스트와 포트에 접근할 수 있어, 네트워크 스캔(Nmap)이나 웹 브라우징, RDP 접속 등 다양한 작업을 동시에 수행하는 데 매우 효율적이다.

2. SOCKS 프록시와 작동 원리

SSH 클라이언트는 지정된 로컬 포트에서 SOCKS 서버 역할을 수행한다.

  1. SOCKS 리스너 생성: ssh -D [LocalPort] 명령으로 공격자 로컬 머신에 SOCKS 리스너를 띄운다(주로 1080/9050 포트 사용).
  2. 애플리케이션 연동: 공격자는 ProxyChains나 웹 브라우저의 프록시 설정(FoxyProxy 등)을 통해 트래픽을 로컬 SOCKS 포트로 보낸다.
  3. 다이나믹 라우팅: SSH 클라이언트는 SOCKS 프로토콜 헤더를 분석하여 목적지 주소를 파악하고, 이를 암호화하여 피벗 호스트로 전송한다.
  4. 최종 전달: 피벗 호스트는 패킷을 복호화한 후, 헤더에 명시된 내부망의 목적지로 트래픽을 대신 전송(Proxy)한다.

3. 명령어 구문 및 도구 설정

3.1 기본 구문

ssh -N -D [LocalBindIP]:[LocalBindPort] [User]@[PivotHost]
  • -D: 다이나믹 포트 포워딩(SOCKS 프록시 생성) 옵션.
  • [LocalBindPort]: 공격자 PC에서 리스닝할 포트 (예: 1080).
  • [LocalBindIP]: 생략 시 127.0.0.1에 바인딩.

3.2 ProxyChains 설정 및 사용

생성된 SOCKS 터널을 활용하기 위해 ProxyChains 도구를 주로 사용한다. ProxyChains는 프록시를 지원하지 않는 일반 명령어(nmap, rdesktop 등)도 강제로 프록시를 경유하게 만들어준다.

  1. 설정 파일 수정 (/etc/proxychains4.conf):
    [ProxyList]
    # SSH -D로 생성한 포트와 프로토콜(socks4 또는 socks5)을 지정
    socks5  127.0.0.1 1080
    
  2. 도구 실행:
    # 내부망(10.1.20.0/24) 웹 서버 스캔
    proxychains nmap -sT -Pn -p 80,443 10.1.20.20
    
    # 내부망 호스트로 RDP 접속
    proxychains rdesktop 10.1.20.10
    
    # 내부망 호스트로 WinRM 접속
    proxychains evil-winrm -i 10.1.20.20 -u user -p password
    

4. 제약 사항 및 OpsSec

4.1 프로토콜 제약

  • TCP Only: 기본적으로 SSH 터널링과 SOCKS4는 TCP 트래픽만 처리 가능하다. SOCKS5는 UDP를 지원하지만, ssh -D 구현체나 네트워크 환경에 따라 UDP 터널링(예: DNS 질의, SNMP 스캔)이 불안정하거나 지원되지 않을 수 있다.
  • 속도 저하: 모든 트래픽이 암호화/복호화 과정을 거치고 터널을 경유하므로, 직접 접속 대비 지연 시간(Latency)이 발생한다. Nmap 스캔 시 -T4 이상의 빠른 속도 옵션은 타임아웃 오류를 유발할 수 있다.

4.2 스캔 시 주의사항 (Nmap)

ProxyChains를 통한 Nmap 스캔 시 SYN Scan(-sS)은 불가능하다. SYN 스캔은 Raw Socket을 조작해야 하는데, SOCKS 프록시는 완전한 TCP 연결(Connect Scan, -sT) 방식만 지원하기 때문이다. 따라서 반드시 -sT 옵션을 사용해야 하며, ICMP 패킷이 터널을 통과하지 못하는 경우가 많으므로 -Pn(Ping Skip) 옵션을 함께 사용하는 것이 필수적이다.